﻿/*
  In App.xaml:
  <Application.Resources>
	  <vm:ViewModelLocatorTemplate xmlns:vm="clr-namespace:Interface.ViewModel"
								   x:Key="Locator" />
  </Application.Resources>
  
  In the View:
  DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
  
  OR (WPF only):
  
  xmlns:vm="clr-namespace:Interface.ViewModel"
  DataContext="{Binding Source={x:Static vm:ViewModelLocatorTemplate.ViewModelNameStatic}}"
*/

using GalaSoft.MvvmLight;
using System;

namespace Medecine.Interface.Main
{
	/// <summary>
	/// This class contains static references to all the view models in the
	/// application and provides an entry point for the bindings.
	/// <para>
	/// Use the <strong>mvvmlocatorproperty</strong> snippet to add ViewModels
	/// to this locator.
	/// </para>
	/// <para>
	/// In Silverlight and WPF, place the ViewModelLocatorTemplate in the App.xaml resources:
	/// </para>
	/// <code>
	/// &lt;Application.Resources&gt;
	///     &lt;vm:ViewModelLocatorTemplate xmlns:vm="clr-namespace:Interface.ViewModel"
	///                                  x:Key="Locator" /&gt;
	/// &lt;/Application.Resources&gt;
	/// </code>
	/// <para>
	/// Then use:
	/// </para>
	/// <code>
	/// DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
	/// </code>
	/// <para>
	/// You can also use Blend to do all this with the tool's support.
	/// </para>
	/// <para>
	/// See http://www.galasoft.ch/mvvm/getstarted
	/// </para>
	/// <para>
	/// In <strong>*WPF only*</strong> (and if databinding in Blend is not relevant), you can delete
	/// the Main property and bind to the ViewModelNameStatic property instead:
	/// </para>
	/// <code>
	/// xmlns:vm="clr-namespace:Interface.ViewModel"
	/// DataContext="{Binding Source={x:Static vm:ViewModelLocatorTemplate.ViewModelNameStatic}}"
	/// </code>
	/// </summary>
	public class ViewModelLocator
	{
		private static MainViewModel _main;

		/// <summary>
		/// Initializes a new instance of the ViewModelLocator class.
		/// </summary>
		public ViewModelLocator()
		{
			CreateMain();
		}

		/// <summary>
		/// Gets the Main property.
		/// </summary>
		public static MainViewModel MainStatic
		{
			get
			{
				if (_main == null)
				{
					CreateMain();
				}

				return _main;
			}
		}

		/// <summary>
		/// Gets the Main property.
		/// </summary>
		[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
			"CA1822:MarkMembersAsStatic",
			Justification = "This non-static member is needed for data binding purposes.")]
		public MainViewModel Main
		{
			get
			{
				return MainStatic;
			}
		}

		/// <summary>
		/// Provides a deterministic way to delete the Main property.
		/// </summary>
		public static void ClearMain()
		{
			if (_main != null)
			{
				_main.Cleanup();
				_main = null;
			}
		}

		/// <summary>
		/// Provides a deterministic way to create the Main property.
		/// </summary>
		public static void CreateMain()
		{
			if (_main == null)
			{
				_main = new MainViewModel();
			}
		}

		/// <summary>
		/// Cleans up all the resources.
		/// </summary>
		public static void Cleanup()
		{
			ClearMain();
		}
	}
}